/*
 *    Copyright © OpenAtom Foundation.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package com.inspur.edp.bef.bemanager.befdtconsistencycheckevent;


import com.inspur.edp.bef.bizentity.bizentitydtevent.IBizEntityActionDTEventListener;
import com.inspur.edp.bef.bizentity.bizentitydtevent.IBizEntityDTEventListener;
import com.inspur.edp.bef.bizentity.bizentitydtevent.IBizEntityFieldDTEventListener;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.actioneventargs.ChangingActionCodeEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.actioneventargs.ChangingActionParamsEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.actioneventargs.ChangingActionReturnEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.actioneventargs.DeletingActionEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.entityeventargs.ChangingEntityCodeEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.entityeventargs.RemovingEntityEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.fieldeventargs.ChangingFieldDataTypeEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.fieldeventargs.ChangingFieldLabelIdEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.fieldeventargs.ChangingFieldObjectTypeEventArgs;
import com.inspur.edp.bef.bizentity.dtconsistencycheck.fieldeventargs.RemovingFieldEventArgs;
import io.iec.edp.caf.commons.event.EventManager;
import io.iec.edp.caf.commons.event.IEventListener;

public class BefDtConsistencyCheckEventManager extends EventManager {

  /**
   * Consistency check 实现抽象方法getCode(),获取事件管理对象的编码
   *
   * @return 事件管理对象的编码
   */
  @Override
  public String getEventManagerName() {
    return "BefDtConsistencyCheckEventManager";
  }

  /**
   * 当前的事件管理者是否处理输入的事件监听者对象
   *
   * @param listener 事件监听者
   * @return 若处理，则返回true,否则返回false
   */
  @Override
  public boolean isHandlerListener(IEventListener listener) {
    return (listener instanceof IBizEntityDTEventListener
        || listener instanceof IBizEntityFieldDTEventListener
        || listener instanceof IBizEntityActionDTEventListener);
  }

  /**
   * 注册事件
   *
   * @param listener 监听者
   */
  @Override
  public void addListener(IEventListener listener) {
    if (!(listener instanceof IBizEntityDTEventListener
        || listener instanceof IBizEntityFieldDTEventListener
        || listener instanceof IBizEntityActionDTEventListener)) {
      throw new RuntimeException(
          "指定的监听者没有实现IBizEntityDTEventListener接口、IBizEntityFieldDTEventListener接口或IBizEntityActionDTEventListener接口！");
    }
    //IBizEntityEventListener
    if (listener instanceof IBizEntityDTEventListener) {
      IBizEntityDTEventListener bizEntityDTEventListener = (IBizEntityDTEventListener) listener;
      this.addEventHandler(BefDtConsistencyCheckType.removingEntity, bizEntityDTEventListener,
          "removingEntity");
    }

    //IBizEntityFieldEventListener
    if (listener instanceof IBizEntityFieldDTEventListener) {
      IBizEntityFieldDTEventListener bizEntityFieldDTEventListener = (IBizEntityFieldDTEventListener) listener;
      this.addEventHandler(BefDtConsistencyCheckType.removingField, bizEntityFieldDTEventListener,
          "removingField");
    }
    //IBizEntityActionDTEventListener
    if (listener instanceof IBizEntityActionDTEventListener) {
      IBizEntityActionDTEventListener bizEntityActionDTEventListener = (IBizEntityActionDTEventListener) listener;
      this.addEventHandler(BefDtConsistencyCheckType.deletingAction,
          bizEntityActionDTEventListener, "deletingAction");
    }


  }

  /***
   * 注销事件
   * @param listener  监听者
   */
  @Override
  public void removeListener(IEventListener listener) {
    if (!(listener instanceof IEventListener)) {
      throw new RuntimeException("指定的监听者没有实现IBizEntityDTEventListener接口！");
    }
    //IBizEntityEventListener
    if (listener instanceof IBizEntityDTEventListener) {
      IBizEntityDTEventListener bizEntityDTEventListener = (IBizEntityDTEventListener) listener;
      this.removeEventHandler(BefDtConsistencyCheckType.removingEntity, bizEntityDTEventListener,
          "removingEntity");
    }

    //IBizEntityFieldEventListener
    if (listener instanceof IBizEntityFieldDTEventListener) {
      IBizEntityFieldDTEventListener bizEntityFieldDTEventListener = (IBizEntityFieldDTEventListener) listener;
      this.removeEventHandler(BefDtConsistencyCheckType.removingField,
          bizEntityFieldDTEventListener, "removingField");
    }
    //IBizEntityActionDTEventListener
    if (listener instanceof IBizEntityActionDTEventListener) {
      IBizEntityActionDTEventListener bizEntityActionDTEventListener = (IBizEntityActionDTEventListener) listener;
      this.removeEventHandler(BefDtConsistencyCheckType.deletingAction,
          bizEntityActionDTEventListener, "deletingAction");
    }
  }

  //entity

  public final void fireRemovingEntity(RemovingEntityEventArgs args) {
    this.fire(BefDtConsistencyCheckType.removingEntity, args);
  }

  //field

  public final void fireRemovingField(RemovingFieldEventArgs args) {
    this.fire(BefDtConsistencyCheckType.removingField, args);
  }

  //action

  public final void fireDeletingAction(DeletingActionEventArgs args) {
    this.fire(BefDtConsistencyCheckType.deletingAction, args);
  }
}
